home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル実用編
/
ペイント
/
GPTOOL.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
17KB
|
534 lines
/******************************************************************************
* gpTool.c: ツール選択ウィンドウ関係のモジュール
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <stdio.h>
#include <string.h>
#include <console.h> /* コンソール系マネージャを利用するときに必要 */
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "gpaint.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* toolMsLDown(): ツール選択ウィンドウでのマウスレフトダウン処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void toolMsLDown(ComVal *pcv)
{
int partCode, sno, wno, kind;
Control **ctrlHdl; /* コントロールハンドル */
/* マウスのボタンが押されている間、コントロールの各種処理をシステムに
任せて、コントロールハンドルとボタンが押された、または離された場所
のパートコードを取得する */
partCode = SXCallCtrlM(&pcv->subwinPtr[TOOL]->win, &pcv->event, 0, 0, NULL, &ctrlHdl);
/* ツールがペン、ブラシ、ルーペなら再設定する */
if ((pcv->toolKind == 0 || pcv->toolKind == 2
|| (pcv->toolKind == 4 && pcv->lupeStat == 1
&& (HIWORD(pcv->toolStat[4]) == 0))) && partCode == C_INTHUMB) {
if (ctrlHdl == pcv->slvHHdl) {
if (pcv->toolKind != 2)
pcv->penSize.p.x = CMValueGet(ctrlHdl);
else
pcv->brushSize.p.x = CMValueGet(ctrlHdl);
} else if (ctrlHdl == pcv->slvVHdl) {
if (pcv->toolKind != 2)
pcv->penSize.p.y = CMValueGet(ctrlHdl);
else
pcv->brushSize.p.y = CMValueGet(ctrlHdl);
}
/* 現在の縦、横幅によるペン、ブラシのイメージを描画する */
drawNowImg(pcv);
} else {
kind = selectTool(pcv, &sno);
/* ツールのとき */
switch (kind) {
case 0:
/* 選択されたツールがルーペ、または選択されてるツール
と違うツールが選択されたか? */
if (sno == 4 || sno != pcv->toolKind)
/* ツールの選択番号を変更する */
changeTool(pcv, sno);
break;
case 1:
wno = pcv->toolStat[pcv->toolKind];
/* ルーペなら */
if (pcv->toolKind == 4) /* ツールボタンか? */
/* 上位の16ビット */
wno = LOWWORD(wno >> pcv->lupeStat * 16);
changeToolSubBtn(pcv, sno);
break;
}
}
}
/******************************************************************************
* drawToolWnd(): ツール選択ウィンドウの描画
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void drawToolWnd(ComVal *pcv)
{
int i;
Rect rc;
drawSubwin(pcv, TOOL); /* サブウィンドウを描画する */
/* ツール選択ウィンドウをテキストタイプでカレントグラフにする */
setGraph(&pcv->subwinPtr[TOOL]->win, G_TXT);
GMAPage(G_PAGE0 | G_PAGE1); /* アクセスページを0と1ページにする */
for (i = 0; i < 8; i++) {
calcToolPctBtn(i, &rc);
if (i < TOOLMAX) {
/* 選択されているツールならピクチャーボタンを表示する */
GMPutRImg(*pcv->tlBtnImg[i], rc.l.l_t);
if (i == pcv->toolKind)
revFrameRect(&rc);
} else
/* 予備のアイコンには使用不可のボタンを描く */
plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
}
/* ツール選択ウィンドウをテキストタイプでカレントグラフにする */
setGraph(&pcv->subwinPtr[TOOL]->win, G_TXT);
/* ツールボタンを描画する */
drawToolSubBtn(pcv, pcv->toolKind);
/* コントロールを表示する */
drawToolCtrl(pcv);
}
/******************************************************************************
* drawToolCtrl(): ツール選択ウィンドウでのコントロールの描画
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void drawToolCtrl(ComVal *pcv)
{
static Rect rcbm1 = { 26, WS_INSIDE_Y + 50, 164, WS_INSIDE_Y + 70 };
static Rect rcbm2 = { 4, WS_INSIDE_Y + 50, 24, WS_INSIDE_Y + 70 };
GMForeColor(G_BLACK); /* フォアグラウンドカラーを黒にする */
/* バックグラウンドカラーをライトグレーにする */
GMBackColor(G_LGRAY);
/* 描画モードをPSETモードにする */
GMPenMode(G_PSET);
GMAPage(G_PAGE0 | G_PAGE1); /* アクセスページを0と1ページにする */
/* ツールがペン、ブラシ、ルーペならコントロールを表示する */
if (pcv->toolKind == 0 || pcv->toolKind == 2
|| (pcv->toolKind == 4 && pcv->lupeStat == 1
&& HIWORD(pcv->toolStat[4]) == 0)) {
GMShadowRect(&rcbm1);
/* 影付きレクタングルを表示する */
GMShadowRect(&rcbm2);
/* フォントモードのセット */
GMFontMode(G_PSET);
/* 文字表示開始位置の設定 */
GMShadowStrZ("幅", LONGWORD( 28, WS_INSIDE_Y + 2 + 52));
GMShadowStrZ("横", LONGWORD( 48, WS_INSIDE_Y + 2 + 52));
GMShadowStrZ("縦", LONGWORD(108, WS_INSIDE_Y + 2 + 52));
if (pcv->toolKind != 2) {
/* ツールがペン、ルーペならば現在のペンサイズを設定
する */
CMValueSet(pcv->slvHHdl, (int) pcv->penSize.p.x);
CMValueSet(pcv->slvVHdl, (int) pcv->penSize.p.y);
} else {
/* ツールがブラシならば現在のブラシサイズを設定する */
CMValueSet(pcv->slvHHdl, (int) pcv->brushSize.p.x);
CMValueSet(pcv->slvVHdl, (int) pcv->brushSize.p.y);
}
/* 現在の縦、横幅によるペン、ブラシのイメージを描画する */
drawNowImg(pcv);
} else {
GMShadowRect(&rcbm1);
GMBackColor(G_DGRAY); /* ペン幅表示不能のため */
GMShadowRect(&rcbm2);
GMBackColor(G_LGRAY);
/* 文字表示開始位置の設定 */
GMShadowStrZ("幅", LONGWORD( 28, WS_INSIDE_Y + 2 + 52));
GMShadowStrZ("横", LONGWORD( 48, WS_INSIDE_Y + 2 + 52));
GMShadowStrZ("縦", LONGWORD(108, WS_INSIDE_Y + 2 + 52));
/* サムの位置を一番左に */
CMValueSet(pcv->slvHHdl, 0);
CMValueSet(pcv->slvVHdl, 0);
}
CMDraw(&pcv->subwinPtr[TOOL]->win);
}
/******************************************************************************
* drawNowImg(): 現在の縦、横幅によるペン、ブラシのイメージを描画する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void drawNowImg(ComVal *pcv)
{
int i, j, k, l;
BitImg *wPtr;
BitImg workbmp[16];
BitImg swork;
Point pt;
Rect rc;
static Rect rcdraw = { 6, WS_INSIDE_Y + 52, 22, WS_INSIDE_Y + 68 };
static BitImg bitcut[16] = {
0, 0x0080, 0x0808, 0x2082, 0x2222, 0x2492, 0x294a, 0x2aaa,
0x5555, 0x6aab, 0x7367, 0x6ddb, 0x7777, 0x7ddf, 0x7f7f, 0xffff
};
GMPenMode(G_PSET); /* 描画モードをP_SETモードにする */
/* フォアグラウンドカラーをライトグレーにする */
GMForeColor(G_LGRAY);
GMFillRect(&rcdraw); /* 描画領域の塗りつぶし */
GMForeColor(G_BLACK); /* フォアグラウンドカラーを黒にする */
GMAPage(G_PAGE0 | G_PAGE1); /* アクセスページを0と1ページにする */
if (pcv->toolKind != 2) { /* ツールがペン、ルーペか? */
/* 描画開始点の算出 */
pt.p.x = 6 + 8 - (pcv->penSize.p.x >> 1);
pt.p.y = WS_INSIDE_Y + 52 + 8 - (pcv->penSize.p.y >> 1);
/* ペンサイズを設定する */
OldPS.x_y = GMPenSize(pcv->penSize.x_y);
/* 描画エリアに点を描画 */
GMMove(pt.x_y);
GMLine(pt.x_y);
/* ペンサイズを元に戻す */
GMPenSize(OldPS.x_y);
} else { /* ツールがブラシなら */
pt.x_y = 0;
if (pcv->brushSize.p.x != 16)
pt.p.x = 16 - pcv->brushSize.p.x;
if (pcv->brushSize.p.y != 16)
pt.p.y = 16 - pcv->brushSize.p.y;
/* 選択されているブラシのビットイメージへのポインタを取得する */
wPtr = &(*pcv->penImg[pcv->toolStat[2]])->data[16];
/* ブラシの幅が16×16でなければ */
/* 縮小されたブラシのビットイメージを作成する */
l = 0; /* ワーク領域の縦方向インデックス */
i = 0; /* 元ビットイメージの縦方向インデックス */
workbmp[0] = 0; /* ワーク領域のクリア */
while (pt.x_y != 0) {
j = 0; /* 元ビットイメージの横方向のビット位置 */
k = 0; /* ワーク領域の横方向のビット位置 */
while (1) {
/* ビットがオンかどうかを調べ、オンならその */
/* ビットデータを取得する */
if ((swork = wPtr[i] & (0x8000 >> j)) != 0)
swork = 0x8000 >> k;
/* ワーク領域に新しい(縮小された)イメージを取得する */
workbmp[l] |= swork;
j++; /* 元イメージのビット位置の更新 */
if (j == 16)
break;
/* ビットのカットをするビットでなければ */
/* ビットのコピー位置を1ビット更新 */
if ((bitcut[pt.p.x] & (0x8000 >> j)) == 0)
k++;
}
i++; /* 元イメージの縦方向インデックスの更新 */
if (i == 16) {
/* 全イメージを縮小コピーしたら */
for (j = l + 1; j < 16; j++)
/* ワーク領域の残りをクリア */
workbmp[j] = 0;
/* ポインタをワーク領域に設定する */
wPtr = workbmp;
/* ループ終了 */
break;
}
/* 縦方向ビットのカットをするビットでなければ */
/* 縦方向ビットのコピー位置を1ビット更新 */
if ((bitcut[pt.p.y] & (0x8000 >> i)) == 0) {
l++;
/* ワーク領域のクリア */
workbmp[l] = 0;
}
}
/* 描画レクタングルの算出 */
rc.d.left = 6 + 8 - (pcv->brushSize.p.x >> 1);
rc.d.right = rc.d.left + 16 - pt.p.x;
rc.d.top = WS_INSIDE_Y + 52 + 8 - (pcv->brushSize.p.y >> 1);
rc.d.bottom = rc.d.top + 16 - pt.p.y;
/* ブラシのイメージを描画する */
GMFillImg(wPtr, &rc);
/* ブラシのイメージデータを保存する */
memcpy(pcv->brushImg, wPtr, 32);
}
}
/******************************************************************************
* selectTool(): ツールの選択状態のチェック
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int *pnum 選択されたツールの番号を格納するポインタ
* 戻り値: int = 0: メイン(上段)のピクチャーボタンが選択された
* = 1: サブ(下段)のピクチャーボタンが選択された
* < 0: 選択なし
* 注釈: 選択されたアイテムの種類と、ツールの番号を返します。
*/
int selectTool(ComVal *pcv, int *pnum)
{
int i;
unsigned short sWork;
LPoint lpt;
Rect rc;
/* ツール選択ウィンドウのツールボタンが選択されているときのサブボタン
の状態 */
static unsigned short toolBmpInf[8] = {
0xfc, 0x7c, 0xff, 0x80, 0xc0, 0, 0, 0
};
/* 入力座標をローカル座標系に変換する */
lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
*pnum = -1;
/* 押された所がどの部分か調べる */
for (i = 0; i < TOOLMAX; i++) {
calcToolPctBtn(i, &rc);
if (GMPtInRect(&rc, lpt)) {
*pnum = i;
return 0; /* 選択されたツールの番号を返す */
}
}
for (i = 0; i < 8; i++) {
sWork = toolBmpInf[pcv->toolKind];
sWork = (sWork >> (7 - i)) & 0x0001;
if (sWork != 0) {
calcToolPctBtn(i + 8, &rc);
if (GMPtInRect(&rc, lpt)) {
*pnum = i;
return 1; /* 選択されているツールが選択された */
}
}
}
return -1;
}
/******************************************************************************
* calcToolPctBtn(): ピクチャーボタンの位置を算出(ツールウィンドウ)
******************************************************************************
* 引数: int num 表示するピクチャーボタン番号(0~7, 8~15)
* Rect *prc 表示位置のレクタングルを格納するポインタ
*/
void calcToolPctBtn(int num, Rect *prc)
{
Point pt;
*prc = pb1size;
pt.p.y = WS_INSIDE_Y + 2;
if (num >= 8) {
num -= 8;
pt.p.y += 24;
}
pt.p.x = 4 + num * 20;
GMSlideRect(prc, pt.x_y);
}
/******************************************************************************
* changeTool(): 上段のピクチャーボタンを変更
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int num メインのピクチャーボタン番号
*/
void changeTool(ComVal *pcv, int num)
{
int wno;
Rect rc;
/* ツール選択ウィンドウをテキストタイプでカレントグラフにする */
setGraph(&pcv->subwinPtr[TOOL]->win, G_TXT);
GMAPage(G_PAGE0 | G_PAGE1); /* アクセスページを0と1ページにする */
wno = pcv->toolKind;
/* 元に戻す */
calcToolPctBtn(pcv->toolKind, &rc);
revFrameRect(&rc);
/* フレームを反転 */
calcToolPctBtn(num, &rc);
revFrameRect(&rc);
pcv->toolKind = num;
if (num == 4) {
/* ルーペが選択された */
if (pcv->toolKind == 4)
/* 今回もルーペなら倍率選択とツール選択の切り替え */
pcv->lupeStat = (pcv->lupeStat & 1) ^ 1;
if (pcv->subwinPtr[LUPE] == NULL) {
/* ルーペウィンドウの表示 */
if (!openSubwin(pcv, 3)) {
/* サブウィンドウが作成できなかった */
DMError(D_CONFIRM, "ルーペウィンドウがオープンできません。");
return;
}
dispLupeRect(pcv); /* 拡大エリアの表示 */
/* ルーペの拡大範囲の移動禁止フラグをクリア*/
pcv->moveLock = FALSE;
pcv->lupeTool = wno; /* 直前のツールの種類を保存する */
}
} else if (pcv->subwinPtr[LUPE] != NULL) {
/* サブウィンドウが作成されていれば */
dispLupeRect(pcv); /* 拡大エリアの消去 */
disposeSubwin(pcv, 3); /* サブウィンドウの消去 */
}
/* ツール選択ウィンドウをカレントグラフにする */
GMSetGraph(&pcv->subwinPtr[TOOL]->win.graph);
GMAPage(G_PAGE0 | G_PAGE1); /* アクセスページを0と1ページにする */
/* 下段のピクチャーボタンの描画 */
drawToolSubBtn(pcv, num);
/* ペンの大きさ設定のアイテムの描画 */
drawToolCtrl(pcv);
}
/******************************************************************************
* changeToolSubBtn(): 下段のピクチャーボタンを変更
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int num サブのピクチャーボタンボタン番号
*/
void changeToolSubBtn(ComVal *pcv, int num)
{
int newno, oldno;
LPoint lpt;
Rect rc;
if (pcv->toolKind == 3) {
/* 消しゴムが選択されていた場合 */
if (num == 0) {
/* NEWボタンのチェック */
calcToolPctBtn(num + 8, &rc);
lpt = EMMSLoc();
if (checkPctBtn(pcv, &rc, lpt, 0))
/* 絵の消去の実行 */
newPicture(pcv);
return;
}
}
newno = num;
oldno = pcv->toolStat[pcv->toolKind];
if (pcv->toolKind == 4) {
oldno = LOWWORD(pcv->toolStat[pcv->toolKind] >> pcv->lupeStat * 16);
newno = num << (pcv->lupeStat * 16);
newno |= pcv->toolStat[4] & 1 << (pcv->lupeStat ^ 1) * 16;
}
/* ピクチャーボタンの番号が変更されている */
if (pcv->toolStat[pcv->toolKind] != newno) {
/* 選択されたピクチャーボタンのフレームを反転 */
/* 元に戻す */
calcToolPctBtn(oldno + 8, &rc);
revFrameRect(&rc);
/* フレームを反転 */
calcToolPctBtn(num + 8, &rc);
revFrameRect(&rc);
/* 選択された番号を保存する */
pcv->toolStat[pcv->toolKind] = newno;
if (pcv->toolKind == 4) /* ルーペの場合 */
/* ルーペの拡大倍率を変更 */
changeLupeRate(pcv, num);
/* ツール選択ウィンドウをカレントグラフにする */
GMSetGraph(&pcv->subwinPtr[TOOL]->win.graph);
/* アクセスページを0と1ページにする */
GMAPage(G_PAGE0 | G_PAGE1);
/* ペンの大きさ設定のアイテムの描画 */
drawToolCtrl(pcv);
}
}
/******************************************************************************
* drawToolSubBtn(): サブのピクチャーボタンの描画
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int num サブのピクチャーボタン番号
*/
void drawToolSubBtn(ComVal *pcv, int num)
{
int i;
Rect rc;
GMAPage(G_PAGE0 | G_PAGE1); /* アクセスページを0と1ページにする */
switch (num) {
case 0: /* 鉛筆 */
for (i = 0; i < 8; i++) {
calcToolPctBtn(i + 8, &rc);
if (i < 6 ) {
GMPutRImg(*pcv->tlBtnImg[i + 5], rc.l.l_t);
if (pcv->toolStat[num] == i)
revFrameRect(&rc);
} else
plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
}
break;
case 1: /* 塗りつぶし */
for (i = 0; i < 8; i++) {
calcToolPctBtn(i + 8, &rc);
if (i != 0 && i < 6 ) {
GMPutRImg(*pcv->tlBtnImg[i + 5], rc.l.l_t);
if (pcv->toolStat[num] == i)
revFrameRect(&rc);
} else {
if (i == 0)
plusRectImg(pcv->tlBtnImg[14], pcv->tlBtnImg[5], 0, rc.l.l_t, 2);
else
plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
}
}
break;
case 2: /* ブラシ */
for (i = 0; i < 8; i++) {
calcToolPctBtn(i + 8, &rc);
plusRectImg(pcv->tlBtnImg[14], pcv->penImg[i], LONGWORD(2, 2), rc.l.l_t, 0);
if (pcv->toolStat[num] == i)
revFrameRect(&rc);
}
break;
case 3: /* 消しゴム */
calcToolPctBtn(0 + 8, &rc);
GMPutRImg(*pcv->tlBtnImg[11], rc.l.l_t);
for (i = 1; i < 8; i++) {
calcToolPctBtn(i + 8, &rc);
plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
}
break;
case 4: /* ルーペ */
for (i = 0; i < 8; i++) {
calcToolPctBtn(i + 8, &rc);
if (i < 2) {
if (pcv->lupeStat) {
/* ルーペのツール選択 */
GMPutRImg(*pcv->tlBtnImg[i], rc.l.l_t);
if (HIWORD(pcv->toolStat[4]) == i)
revFrameRect(&rc);
} else {
/* ルーペの倍率選択 */
GMPutRImg(*pcv->tlBtnImg[i + 12], rc.l.l_t);
if (LOWWORD(pcv->toolStat[4]) == i)
revFrameRect(&rc);
}
} else
plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
}
break;
}
}